#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define inf 1000000000
#define N 100010
#define M 1000010
int idx=1,n,m,s,t,ans,dist[N]; bool vis[N];
int head[N],to[M<<2],val[M<<2],cost[M<<2],nxt[M<<2];
void add(int a,int b,int c,int d)
    {nxt[++idx]=head[a],to[idx]=b,val[idx]=c,cost[idx]=d,head[a]=idx;}
bool spfa(int s,int t)
{
    memset(vis,0,sizeof vis);
    for(int i=1;i<=n;i++) dist[i]=inf; dist[t]=0,vis[t]=1;
    deque <int> q; q.push_back(t);
    while(!q.empty())
    {
        int p=q.front(); q.pop_front();
        for(int i=head[p];i;i=nxt[i])
            if(val[i^1]&&dist[to[i]]>dist[p]-cost[i])
            {
                dist[to[i]]=dist[p]-cost[i];
                if(!vis[to[i]])
                {
                    vis[to[i]]=true;
                    if((!q.empty())&&dist[to[i]]<dist[q.front()]) q.push_front(to[i]);
                    else q.push_back(to[i]);
                }
            }
        vis[p]=false;
    } return dist[s]<inf;
}
int dfs(int p,int flow)
{
    int temp=flow,now; vis[p]=true;
    if(p==t) return flow;
    for(int i=head[p];i;i=nxt[i])
        if((!vis[to[i]])&&val[i]&&dist[p]-cost[i]==dist[to[i]])
        {
            now=dfs(to[i],min(temp,val[i]));
            if(now) ans+=now*cost[i],val[i]-=now,val[i^1]+=now,temp-=now;
            if(!temp) break;
        } return flow-temp;
}
int costflow()
{
    int flow=0;
    while(spfa(s,t))
    {
        vis[t]=true;
        while(vis[t]) memset(vis,0,sizeof vis),flow+=dfs(s,inf);
    } return flow;
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(int i=1,a,b,c,d;i<=m;i++) scanf("%d%d%d%d",&a,&b,&c,&d),add(a,b,c,d),add(b,a,0,-d);
    printf("%d ",costflow()),printf("%d\n",ans);
}